﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Process.Bovespa.Distribuicao.Server.ProcessLogic.Translator.LayoutToProcessEntity
{
    public class Distribuicao
    {
        public ProcessEntity.DistribuicaoHeader ToDistribuicaoHeader(Layout.DistribuicaoHeader from)
        {
            ProcessEntity.DistribuicaoHeader to = null;

            if (from != null)
            {
                to = new ProcessEntity.DistribuicaoHeader();

                to.CodigoUsuario = from.CodigoUsuario;
                to.DataPregao = from.DataPregao;
                to.NomeArquivo = from.NomeArquivo;
                to.Reserva = from.Reserva;

                if (from.TipoDistribuicao.HasValue)
                {
                    switch (from.TipoDistribuicao.Value)
                    {
                        case Layout.Enum.TipoDistribuicao.P:
                            to.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.Percentual;
                            break;
                        case Layout.Enum.TipoDistribuicao.M:
                            to.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.PrecoMedioLote;
                            break;
                        case Layout.Enum.TipoDistribuicao.D:
                            to.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.PrecoMedioDigitado;
                            break;
                        case Layout.Enum.TipoDistribuicao.O:
                            to.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.PrecoMedioOrdem;
                            break;
                        case Layout.Enum.TipoDistribuicao.R:
                            to.TipoDistribuicao = ProcessEntity.Enum.TipoDistribuicao.PrecoDigitadoOrdem;
                            break;
                    }
                }

                to.TipoRegistro = from.TipoRegistro;
            }

            return to;
        }

        public ProcessEntity.DistribuicaoHeader ToDistribuicaoHeader(Layout.DistribuicaoXMLIdentificador from)
        {
            ProcessEntity.DistribuicaoHeader to = null;

            if (from != null)
            {
                to = new ProcessEntity.DistribuicaoHeader();

                to.CodigoUsuario = from.CodigoUsuario;
                to.NomeArquivo = from.CodigoArquivo;

                if (from.Evento != null)
                {
                    to.DataPregao = DateTime.ParseExact(from.Evento.DataPregao, "dd/MM/yyyy", null);

                    to.TipoDistribuicao = (ProcessEntity.Enum.TipoDistribuicao)EnumConverter.Parse(typeof(ProcessEntity.Enum.TipoDistribuicao), from.Evento.TipoDistribuicao);
                }
            }

            return to;
        }

        public ProcessEntity.DistribuicaoDetail ToDistribuicaoDetail(Layout.DistribuicaoDetail from)
        {
            ProcessEntity.DistribuicaoDetail to = null;

            if (from != null)
            {
                to = new ProcessEntity.DistribuicaoDetail();

                switch (from.BolsaNegocio)
                {
                    case Layout.Enum.BolsaNegocio.Bovespa:
                        to.BolsaNegocio = ProcessEntity.Enum.BolsaNegocio.Bovespa;
                        break;
                    case Layout.Enum.BolsaNegocio.Soma:
                        to.BolsaNegocio = ProcessEntity.Enum.BolsaNegocio.Soma;
                        break;
                }

                to.CarteiraLiquidacao = from.CarteiraLiquidacao;
                to.ClienteCustodianteArbitragem = from.ClienteCustodianteArbitragem;
                to.CodigoCliente = from.CodigoCliente;
                to.CodigoISIN = from.CodigoISIN;
                to.CustodianteArbitragem = from.CustodianteArbitragem;
                to.DigitoCliente = from.DigitoCliente;
                to.DigitoCustodianteArbitragem = from.DigitoCustodianteArbitragem;

                switch (from.NaturezaOperacao)
                {
                    case Layout.Enum.NaturezaOperacao.C:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Compra;
                        break;
                    case Layout.Enum.NaturezaOperacao.V:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Venda;
                        break;
                }
                to.NumeroOrdem = from.NumeroOrdem;
                to.PercentualAcrescimo = from.PercentualAcrescimo;
                to.PrazoTermo = from.PrazoTermo;
                to.PrecoNegocio = from.PrecoNegocio;
                to.Quantidade = from.Quantidade;

                switch (from.TipoLiquidacao)
                {
                    case Layout.Enum.TipoLiquidacao.C:
                        to.TipoLiquidacao = ProcessEntity.Enum.TipoLiquidacao.Custodiante;
                        break;
                    case Layout.Enum.TipoLiquidacao.A:
                        to.TipoLiquidacao = ProcessEntity.Enum.TipoLiquidacao.Arbitragem;
                        break;
                }
                to.TipoRegistro = from.TipoRegistro;
            }

            return to;
        }

        public List<ProcessEntity.DistribuicaoDetail> ToDistribuicaoDetail(List<Layout.DistribuicaoXMLDistribuicao> from)
        {
            List<ProcessEntity.DistribuicaoDetail> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.DistribuicaoDetail>();

                foreach (Layout.DistribuicaoXMLDistribuicao item in from)
                {
                    to.Add(ToDistribuicaoDetail(item));
                }
            }

            return to;
        }

        public ProcessEntity.DistribuicaoDetail ToDistribuicaoDetail(Server.Layout.DistribuicaoXMLDistribuicao from)
        {
            ProcessEntity.DistribuicaoDetail to = null;

            if (from != null)
            {
                to = new ProcessEntity.DistribuicaoDetail();

                to.BolsaNegocio = (ProcessEntity.Enum.BolsaNegocio)EnumConverter.Parse(typeof(ProcessEntity.Enum.BolsaNegocio), from.BolsaNegocio);
                to.CarteiraLiquidacao = from.CarteiraLiquidacao;
                to.ClienteCustodianteArbitragem = from.ClienteCustodianteArbitragem;
                to.CodigoCliente = from.CodigoCliente;
                to.CodigoISIN = from.CodigoISIN;
                to.CustodianteArbitragem = from.CustodianteArbitragem;
                to.DigitoCliente = from.DigitoCliente;
                to.DigitoCustodianteArbitragem = from.DigitoCustodianteArbitragem;
                to.NaturezaOperacao = (ProcessEntity.Enum.NaturezaOperacao)EnumConverter.Parse(typeof(ProcessEntity.Enum.NaturezaOperacao), from.NaturezaOperacao);
                to.NumeroOrdem = from.NumeroOrdem;
                to.PercentualAcrescimo = Convert.ToDecimal(from.PercentualAcrecimo);
                to.PrazoTermo = from.PrazoTermo;
                to.PrecoNegocio = Convert.ToDecimal(from.PrecoNegocio);
                to.TipoLiquidacao = (ProcessEntity.Enum.TipoLiquidacao)EnumConverter.Parse(typeof(ProcessEntity.Enum.TipoLiquidacao), from.TipoLiquidacao);
            }

            return to;
        }
    }
}
